package com.ceair.util;

import com.ceair.entity.model.UserInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
import org.springframework.stereotype.Component;

import static com.ceair.constant.SecurityConstants.TOKEN_UNIQUE_ID;

/**
 * @author wangbaohai
 * @ClassName UserInfoUtils
 * @description: 获取上下文用户信息
 * @date 2025年03月18日
 * @version: 1.0.0
 */
@Slf4j
@Component
public class UserInfoUtils {

    /**
     * 从认证信息中获取用户信息。
     * 该方法会从SecurityContext中获取当前认证信息，并解析JWT令牌以获取用户ID和账号。
     * 如果解析失败，则返回默认的系统用户信息。
     *
     * @return UserInfo 返回当前用户的信息，如果无法获取则返回系统默认用户信息
     */
    public UserInfo getUserInfoFromAuthentication() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication instanceof JwtAuthenticationToken jwtAuthenticationToken) {
            Jwt token = jwtAuthenticationToken.getToken();
            if (token != null) {
                String uniqueId = token.getClaimAsString(TOKEN_UNIQUE_ID);
                if (uniqueId != null && !uniqueId.isEmpty()) {
                    try {
                        return UserInfo.builder()
                                .id(Long.parseLong(uniqueId))
                                .account(authentication.getName())
                                .build();
                    } catch (NumberFormatException e) {
                        // 处理转换失败的情况
                        log.error("转换用户信息失败 具体原因为 : {}", e.getMessage());
                        return getUserInfo();
                    }
                }
            }
        }
        return getUserInfo();
    }

    /**
     * 获取默认的系统用户信息。
     * 该方法返回一个默认的用户信息对象，ID为0，账号为"系统自动更新"。
     *
     * @return UserInfo 返回默认的系统用户信息
     */
    private UserInfo getUserInfo() {
        return UserInfo.builder().id(0L).account("系统自动更新").build();
    }

}
